home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / amiga-magazin-pd / 11-94-6 / xass 64 / xass 1.0 / anleitung next >
Text File  |  1995-03-09  |  59KB  |  989 lines

  1.    Sind  Sie  stolzer  Besitzer  sowohl  eines  Commodore 64 als auch eines
  2. Commodore  Amiga?   Programmieren Sie noch immer professionelle Software in
  3. Assembler auf dem guten alten C64? Dann werden Sie wahrscheinlich oft, wenn
  4. Sie  sich  mit  der,  im  Vergleich  zum  Amiga wohl als vorsintflutlich zu
  5. bezeichnenden  Programmierumgebung  herumschlagen mußten, neidisch zu Ihrem
  6. Amiga   geblickt  haben.   Von  diesem   mit   tollen  Editoren, grafischer
  7. Benutzeroberfläche,  Windowing, Multitasking und hoher Geschwindigkeit ver-
  8. wöhnt,  bleibt  Ihnen  trotzdem  nichts  anderes übrig, als mit dem kleinen
  9. Speicher  und  der  langsamen  Floppy  zusätzlich zum unkomfortablen Basic-
  10. editor,  der  meist  benutzt werden muß, auszukommen.  Welche Probleme sich
  11. hier ergeben, kann sich wahrscheinlich jeder lebhaft vorstellen.
  12.     Es dürfte bereits klar sein, auf was ich hinaus will:  Es müßte einfach
  13. eine Möglichkeit geben, dem Amiga die Maschinensprache des C64 beizubringen
  14. um  dann  auf  diesem  mit  all  seinen Möglichkeiten Programme für den C64
  15. erstellen  zu  können  - auf komfortablere und einfachere Weise, als es mit
  16. dem  C64  selbst je möglich wäre.  Schließlich müssten sich diese Programme
  17. dann  noch  zum  C64 übertragen lassen.  Am Ende dieses Gedankenganges (und
  18. noch  vieler  weiterer  kleiner  Einfälle)  steht das, was Sie nun vor sich
  19. liegen haben:  Das 6510-Developers-Packet.
  20.    Obwohl die Idee, auf größeren Rechnern Programme für kleinere Rechner zu
  21. entwickeln,  nicht neu ist, wurde sie auf dem Amiga für den doch immer noch
  22. recht  beliebten  und für sein Alter von nunmehr 10 Jahren noch erstaunlich
  23. leistungsfähigen  C64  in  dieser  Weise (so weit ich weiß) noch nie reali-
  24. siert.   Das  6510-Developers-Packet  beinhaltet deswegen alle Komponenten,
  25. die  nötig  sind, um  einerseits  dem Amiga das nötige Wissen zu geben, mit
  26. 6510-Assembler  etwas  anfangen  zu können und andererseits die Übertragung
  27. zum  C64  zu realisieren. Der im Paket enthaltene 6510-Cross-Makroassembler
  28. "CrossAss V1.0"   ist  dafür  zuständig, den Amiga mit 6510-Assembler,  für
  29. den er  normalerweise  kein  Verständnis hat, vertraut zu machen. "CrossAss
  30. V1.0"  kann  6510-Assemblerprogramme,  die  mit  einem beliebigen  Textedi-
  31. tor Ihrer Wahl erstellt wurden, "interpretieren" und die darin  enthaltenen
  32. 6510-Mnemonics in Opcodes umwandeln (=assemblieren).  So entsteht noch  auf
  33. dem Amiga  ein  auf  dem  C64  lauffähiges Maschinensprachprogramm, welches
  34. nur noch übertragen werden muß.
  35.     Da  das  Programm  im  Speicher  des  Amiga  praktisch  bereits genauso
  36. vorliegt, wie es der C64 später brauchen wird, beschränkt sich der Teil der
  37. Software,  die  für den C64 bestimmt ist, auf Routinen, die den Empfang der
  38. Daten realisieren.  Prinzipiell gibt es zur Übertragung der Daten vom Amiga
  39. zum  C64  zwei einfache Möglichkeiten, nämlich die serielle Übertragung per
  40. RS232-Schnittstelle  oder  die  parallele  Übertragung vom Parallelport des
  41. Amiga  zum  Userport  des C64.  Die erste Möglichkeit hat zwar den Vorteil,
  42. daß  Übertragungsroutinen  bereits in den Betriebssystemen sowohl des Amiga
  43. als  auch  des  C64  enthalten  sind, jedoch aber auch einige entscheidende
  44. Nachteile.  Zunächst besitzt der C64 zwar RS232-Routinen, aber keine solche
  45. Schnittstelle.  Diese müßte über relativ komplizierte Hardwareerweiterungen
  46. nachgerüstet  werden.  Außerdem ist die serielle Schnittstelle aufgrund der
  47. Notwendigkeit   des  Taktens  der  Übertragung  mit  auf  beiden  Computern
  48. übereinstimmenden    Übertragungsraten    (BAUD/BPS-Raten)   eine   heikle,
  49. umständliche  und  nicht gerade einfache Sache.  Die zweite Möglichkeit hat
  50. nur  den Nachteil fehlender Betriebssystemunterstützung durch den C64.  Die
  51. Vorteile  sind  jedoch immens:  Durch Übertragung von jeweils 8 Bit und die
  52. selbstständige Geschwindigkeitsanpassung  (Handshaking)  tritt  keines  der
  53. Probleme  der  seriellen  Übertragung  auf und die Geschwindigkeit erreicht
  54. immer  das  Maximum.   Da  der  C64 nur empfängt, aber selbst nicht sendet,
  55. liegt  nichts  näher,  als den C64 wie einen Drucker am parallelen Port des
  56. Amiga  anzusprechen,  was  durch  das  Betriebssystem  des Amiga ja sowieso
  57. unterstützt wird.
  58.    Das  Kabel  an  sich  ist entsprechend sehr einfach aufgebaut.  Trotzdem
  59. sollte  der Nachbau sorgfältig erfolgen, da falsch angelötete Leitungen die
  60. Zerstörung  eines  oder  beider Computer zur Folge haben können.  Markieren
  61. Sie     sich    auch    die    Oberseite    des    nicht    verdrehsicheren
  62. C64-Userport-Steckers!   Außerdem  darf  das  Kabel nie eingesteckt werden,
  63. wenn  die  Rechner  gerade in Betrieb sind.  Sind beide Rechner erfolgreich
  64. mit  dem  Kabel  verbunden,  so  kann  nach  vollendeter  Assemblierung die
  65. Übertragung beginnen, wobei hier zwei verschiedene Empfangsroutinen auf dem
  66. C64  dafür  sorgen,  daß  die  übertragenen  Daten entweder direkt auf Disk
  67. ("Transfer") oder im RAM des C64 ("TransRAM") landen.  Dort können sie dann
  68. weiterverwendet werden.
  69.  
  70.    Für  die  Funktionsweise  des  Assemblers  wurde die auf dem C64 übliche
  71. 2-Pass-Assemblierung  verwendet.   Das  bedeutet,  daß  der  Assembler  den
  72. Quelltext zweimal durchläuft, wobei er in  Pass 1 nur die Labeldefinitionen
  73. übernimmt.   In  Pass  2  erfolgt  dann  die  eigentliche Assemblierung des
  74. Quelltextes  mit Zugriff auf alle Labels.  Auf daraus folgende Konsequenzen
  75. wird noch öfter in dieser Anleitung eingegangen werden.
  76.    Wie  bereits  erwähnt,  erfolgt die Eingabe der 6510-Assembler-Programme
  77. mit einem Texteditor Ihrer Wahl.  Das kann entweder Ihr Lieblingstexteditor
  78. oder  Ihre  Lieblingstextverarbeitung  (im ASCII-Modus) sein, oder auch die
  79. Editoren "Ed" der Workbench- bzw.  "MicroEmacs" der Extras-Diskette.  Damit
  80. CrossAss V1.0 Ihren Quelltext aber auch wirklich verstehen kann, müssen Sie
  81. sich  an einige Regeln halten. Wie Sie sehen werden, ist CrossAss hier aber
  82. äußerst  großzügig.  Der grundsätzliche Aufbau einer Zeile sieht in etwa so
  83. aus:
  84.  
  85. LABEL  ANWEISUNG  OPERAND,OPERAND,OPERAND... ;KOMMENTAR
  86.  
  87. "In  etwa"  nur  deshalb,  weil eine Quelltextzeile nicht immer exakt obige
  88. Gestalt annimmt.  Ganz im Gegenteil kann auch der Fall auftreten, daß keine
  89. der  obigen  Komponenten  tatsächlich vorhanden sind.  Wichtig ist zunächst
  90. nur,  daß sowohl Label als auch Anweisung (wird alles noch erklärt) und der
  91. erste  Operand  durch  mindestens  ein  Leerzeichen getrennt werden müssen.
  92. Sollten  mehrere  Operanden  folgen, so werden diese durch Kommata getrennt
  93. angegeben.  Ein eventuell angefügter Kommentar wird durch ein Semikolon ";"
  94. eingeleitet  und  endet  am Zeilenende.  Ist das erste Nichtleerzeichen der
  95. Zeile  sofort  ein  Semikolon,  so  wird  entsprechend  die ganze Zeile als
  96. Kommentarszeile überlesen.  Ist die Zeile völlig leer (eben der obige Fall,
  97. daß  keine  der Komponenten der Zeile vorhanden sind), so wird entsprechend
  98. auch  nichts  assembliert.   Sie  können also zur Strukturierung Ihres Pro-
  99. gramms einfach Leerzeilen einfügen, was zur Übersichtlichkeit beiträgt.
  100.    Da  ich vorraussetze, daß Sie bereits auf dem C64 mit anderen Assemblern
  101. gearbeitet  haben,  wird  Ihnen  dieser  Zeilenaufbau  nicht fremd sein und
  102. entsprechend  dürfte  die  Verwendung  eines  Labels  am  Zeilenanfang  zur
  103. Zuweisung  des aktuellen Programmcounters ebenfalls bekannt sein, da gerade
  104. diese  Möglichkeit  ja  die Flexibilität eines Assemblers ausmacht.  Es ist
  105. aber natürlich keine Pflicht, ein Label am Anfang der Zeile zu definieren.
  106.    Unter  Anweisung  versteht sich entweder ein Mnemonic, ein Pseudo-Opcode
  107. oder  ein  Makroname.   All  diese  Begriffe  sind  Ihnen  sicherlich nicht
  108. unbekannt,  so  daß  die Begriffserläuterungen unten genügen sollte.  Damit
  109. der  Rahmen  dieses  Artikels nicht gesprengt wird, kann hier natürlich nur
  110. auf CrossAss V1.0-spezifische Dinge genauer eingegangen werden.
  111.    Beachten  Sie beim Erstellen des Quelltextes, daß grundsätzlich nur eine
  112. Anweisung   pro   Zeile  stehen  darf.   Die  Definition  eines  Labels  am
  113. Zeilenanfang  und  die Verwendung eines Kommentars ist, wie bereits gesagt,
  114. optional.   Mit  Kommentaren sollten Sie aber aus Selbstzweck nicht sparen,
  115. sofern Sie sich später noch in Ihrem Programm auskennen wollen.
  116.  
  117.    Die  Anzahl  der  auf  die  Anweisung  folgenden Operanden hängt von der
  118. Anweisung  selbst  ab.  Während auf Mnemonics grundsätzlich nur ein Operand
  119. folgt,  der unter anderem die Adressierungsart bestimmt, können auf Makros,
  120. je nach Definition, und auf Pseudo-Opcodes, je nach "Natur", auch zwei oder
  121. mehrere  Operanden  folgen.   Es  wird  zwischen  drei  Arten von Operanden
  122. unterschieden:
  123.  
  124. - Terme
  125. - Mnemonic-Operanden (enthalten Terme)
  126. - Texte
  127.  
  128.    CrossAss V1.0 bietet die Möglichkeit, überall dort, wo Werte assembliert
  129. werden  sollen,  mathematische  Terme  zu  verarbeiten.   Dabei  hält  sich
  130. CrossAss  an die mathematischen Grundregeln (Punkt vor Strich etc.).  Terme
  131. können  durch  die  Verwendung von "(", "[", ")" und "]" geklammert werden.
  132. Die in einem Term verwendeten Zahlen können als
  133.  
  134. - Ziffernfolgen
  135. - Labels
  136. - Makroparameter
  137. - Zeichen
  138. - "*"
  139.  
  140. auftreten.  Ziffernfolgen können dabei in vier verschiedenen Zahlensystemen
  141. verwendet  werden,  worüber  das Vorzeichen der Zahl entscheidet.  Dezimal-
  142. zahlen  (Basis  10) haben kein Vorzeichen, Hexadezimalzahlen (Basis 16) ein
  143. "$"  (Zusatzziffern  "a"-"f"  bzw.  "A"-"F"), Oktalzahlen (Basis 8) ein "&"
  144. und  Binärzahlen  (Basis  2) ein "%".  Bei der Verwendung von Labels werden
  145. diese  durch ihre Werte ersetzt.  Makroübergabeparameter sind nur innerhalb
  146. von  Makroquelltexten  verwendbar.   Sie  werden  durch  das Vorzeichen "?"
  147. eingeleitet,  auf  das eine Ziffer zwischen 0 und 9 (einschließlich) folgt,
  148. die  die Nummer des Parameters bestimmt (0 = Parameter 1 ...  9 = Parameter
  149. 10).   Die  Verwendung  von  Zeichen  wird durch das Vorzeichen "'" (ALT+ä)
  150. eingeleitet  auf  welches  das  zu  verwendende Zeichen folgen muß.  Dieses
  151. Zeichen  wird  durch  seinen  ASCII-Code  ersetzt,  welcher  mit  Hilfe der
  152. veränderbaren  (wird  später erklärt) Konvertierungstabelle angepasst wird.
  153. Die  Zahl  "*"  schließlich  ist  ein  Sonderfall.  Sie wird bei der Assem-
  154. blierung durch den aktuellen Programmzähler ersetzt.  Vor alle Zahlen, aber
  155. auch  vor  geklammerte  Terme können zusätzlich noch die Vorzeichen "<" und
  156. ">" gestellt werden, die CrossAss V1.0 veranlassen, nur das Low- ("<") bzw.
  157. das  Highbyte  (">")  des  Wertes zu verwenden.  Neben den Grundrechenarten
  158. "+",  "-", "*" (Multiplikation) und "/" (Division) kennt CrossAss V1.0 noch
  159. folgende weitere Rechenarten:
  160.  
  161. "|"         ODER-Verknüpfung linker Wert mit rechtem Wert
  162. "&"         UND-Verknüpfung linker Wert mit rechtem Wert (nicht zu
  163.             verwechseln mit dem Vorzeichen oktaler Zahlen)
  164. "^"         EXCLUSIV-ODER Verknüpfung linker Wert mit rechtem Wert
  165. "<"         Verschiebung von linkem Wert um rechten Wert Bits nach LINKS
  166.             (nicht zu verwechseln mit Vorzeichen "<")
  167. ">"         Verschiebung von linkem Wert um rechten Wert Bits nach RECHTS
  168.             (nicht zu verwechseln mit Vorzeichen ">")
  169.  
  170.    Mnemonic-Operanden  können  logischerweise  nur auf Mnemonics folgen und
  171. enthalten  sowohl die Adressierungsart des Mnemonics selbst, als auch einen
  172. zur Adressierungsart gehörenden Wert, wobei dieser je nach Adressierungsart
  173. eine  Breite  von 8 oder 16 Bit hat.  Natürlich kann auch dieser Wert durch
  174. einen Term angegeben werden.  Die Angabe der Adressierungsart erfolgt durch
  175. die Standardschreibweisen, die allgemein bekannt sein dürften:
  176.  
  177. immediate (8 Bit):                  #Term
  178. absolut  (16 Bit):                  Term
  179. absolut x-indiziert (16 Bit):       Term,x
  180. absolut y-indiziert (16 Bit):       Term,y
  181. Zeropage (8 Bit):                   Term
  182. Zeropage x-indiziert (8 Bit):       Term,x
  183. Zeropage y-indiziert (8 Bit):       Term,y
  184. indiziert indirekt (8 Bit):         (Term,x)
  185. indirekt indiziert (8 Bit):         (Term),y
  186. relativ (16 Bit):                   Term
  187. indirekt (16 Bit):                  (Term)
  188. Akkumulator/implement (8 Bit):      kein Operand !
  189.  
  190. Zu beachten gibt es hier folgendes:  Bei den indizierten Adressierungen ist
  191. es  egal,  ob  die  Angabe  des  Indexregister  in  Groß- oder Kleinschrift
  192. erfolgt.    Bei  relativer  Adressierung  wird  der  16-Bit-Wert  in  einen
  193. relativen,   vorzeichenbehafteten   8-Bit-Wert   umgewandelt,  so  daß  bei
  194. Branchsprüngen eine  maximale Reichweite von 126 Byte in Richtung Programm-
  195. anfang  bzw.   129  Byte  in  Richtung  Programmende  erreicht  wird.   Bei
  196. indirekten  Adressierungen  dürfen  nur  runde  Klammern als Adressierungs-
  197. merkmal  benutzt  werden,  eckige  Klammern  sind der Klammerung von Termen
  198. vorbehalten.   Vorsicht  ist  bei der Unterscheidung zwischen den Zeropage-
  199. und   absoluten  Adressierungsarten  geboten.   Hier  wird  nur  durch  die
  200. Bitbreite  des  Wertes  entschieden  um  welche  Adressierungsart  es  sich
  201. handelt.   Eine  Problem  kann  sich  hierbei  nämlich  daraus ergeben, daß
  202. CrossAss  ein  2-Pass-Assembler  ist.  Wie bereits erwähnt, beschränkt sich
  203. die  Arbeit  von  CrossAss  in Pass 1 ausschließlich auf das Definieren der
  204. Labels.   Da  für  die  Definition  von  Labels  am  Zeilenanfang  aber der
  205. Programmcounter  bekannt  sein muß, müssen bereits hier alle Adressierungs-
  206. arten  richtig  erkannt werden.  Wird nun eine Adressierung in Abhängigkeit
  207. eines  Labels  gebracht,  das  darüber  entscheidet,  ob  es  sich  um eine
  208. Zeropage-  oder  um  eine  absolute Adressierungsart handelt und ist dieses
  209. Label noch nicht bekannt, weil es z.B.  später im Quelltext definiert wird,
  210. so   nimmt   der   Assembler   an,   es   handele   sich  um  die  absolute
  211. Adressierungsart.   Wird  dieses  Label  später jedoch so definiert, daß es
  212. sich  in  Wahrheit  um  eine  Zeropageadressierung gehandelt hätte, so wird
  213. diese  in  Pass  2  zwar  richtig  assembliert,  aber  es  ergibt sich eine
  214. Differenz  zwischen  den  Programmcountern  in  Pass  1  und Pass 2 was mit
  215. höchster  Wahrscheinlichkeit falsche Sprungadressen im Objektcode zur Folge
  216. hat,  ohne  daß  der Assembler hiervor warnen könnte.  Sollte also der Fall
  217. gegeben  sein,  daß  eine Zeropageadressierung in Abhängigkeit eines Labels
  218. assembliert  werden soll, so muß in diesem Fall unbedingt das Label bereits
  219. vorher  im  Quelltext  definiert  worden sein!  Möchte man jedoch genau den
  220. entgegengesetzten  Fall  erreichen,  nämlich unbedingt eine absolute Adres-
  221. sierungsart   erzwingen   (manchmal   notwendig  bei  selbstmodifizierenden
  222. Programmen),  so  muß vor den gesamten Operanden das Vorzeichen "!" gesetzt
  223. werden.
  224.    Die  letzte  Art eines Operanden tritt ausschließlich bei Pseudo-Opcodes
  225. auf.   Es  handelt  sich  um  ganze  Texte,  die z.B.  Dateinamen enthalten
  226. können, aber auch dazu bestimmt sein können, in den Objektcode eingefügt zu
  227. werden.   In letzterem Fall werden sie wieder mit Hilfe der Konvertierungs-
  228. tabelle  angepasst.  Ein Text beginnt und endet mit einem Anführungszeichen
  229. ("),  wobei  keines  der  beiden  vergessen werden darf.  Texte können ent-
  230. sprechend alle Zeichen, also auch Kommata, enthalten.
  231.    Die maximale Anzahl einzelner Operanden beträgt übrigens 32, während die
  232. maximale  Länge  eines  jeden Operanden 80 Zeichen nicht überschreiten darf
  233. (wichtig bei Texten).
  234.  
  235.    Zu  Mnemonics  und  deren  Adressierungsarten  braucht  im Rahmen dieser
  236. Anleitung  wohl  nichts mehr  gesagt  werden, da  diese  entweder  bekannt,
  237. oder  in jeder Fachliteratur zum 6510 nachzulesen sind.  Die Pseudo-Opcodes
  238. von  CrossAss müssen jedoch einzeln erläutert werden, da sie sich in vielen
  239. Punkten  von  denen  anderer  Assembler  unterscheiden  und  außerdem stark
  240. unterschiedliche  Funktionen  haben.  Zunächst  sollte die Schreibweise der
  241. Pseudo-Opcodes  vereinbart  werden,  denn auch hier sind sie eine Ausnahme.
  242. Alle   Pseudo-Opcodes  beginnen  mit  dem  Punkt  ".".   Darauf  folgt  der
  243. eigentliche  Name  des  Pseudo-Opcode.   Da  der  Assembler  Pseudo-Opcodes
  244. entsprechend sehr leicht erkennt, braucht der Name des Pseudo-Opcodes nicht
  245. vollständig  angegeben  werden.  Es genügen soviele Zeichen, wie zur unver-
  246. wechselbaren Unterscheidung notwendig sind (Also z.B.  ".in" für ".include"
  247. aber nicht nur ".i", da dies auch für ".if" stehen könnte).  Zwischen Groß-
  248. und Kleinschreibung wird nicht unterschieden.
  249.  
  250. .BYTE
  251.    Der  ".byte"-Pseudo-Opcode  dient  zum  Einfügen  von  Bytefolgen in den
  252. Quelltext  (z.B.   Tabellen).   Die  Bytes  werden als Operanden angegeben.
  253. Entsprechend  der  Maximalzahl können also max.  32 Bytes pro Pseudo-Opcode
  254. angegeben werden.
  255.  
  256. .WORD
  257.    Der  ".word"-Pseudo-Opcode  fügt  16-Bit-Worte  im 6510-typischen Format
  258. Low-Byte/High-Byte  in  den Quelltext ein.  Anstatt ".word 1200" könnte man
  259. also auch ".byte <1200,>1200" schreiben.
  260.  
  261. .BLOCK
  262.    Der  ".block"-Pseudo-Opcode  kann  ein angegebenes Byte entsprechend der
  263. angegebenen  Anzahl oft in den Quelltext einfügen.  Parameter 1 enthält die
  264. Anzahl  (max.   65535),  Parameter 2 das Byte selbst.  Dieser Befehl sollte
  265. nicht  zu  großzügig  angewendet  werden,  da  er  den Objektcode meist nur
  266. unnötig verlängert.
  267.  
  268. .ASCII
  269.    Der  ".ascii"-Pseudo-Opcode  dient  dazu,  einen  Text in den Objektcode
  270. einzufügen.   Der  Text wird als Operand angegeben (Anführungszeichen nicht
  271. vergessen) und von CrossAss mit Hilfe der Konvertierungstabelle angepasst.
  272.  
  273. .BASE
  274.    Der ".base"-Pseudo-Opcode definiert die Startadresse des Objektcodes und
  275. dessen  Dateinamen.  Die Adresse wird als erster, der Dateiname inkl.  Pfad
  276. als   zweiter   Parameter   angegeben.   Durch  mehrmaliges  Verwenden  des
  277. ".base"-Pseudo-Opcodes   bietet   CrossAss   V1.0   als   Besonderheit  die
  278. Möglichkeit  des  Objektcodesplitting.   Das  heißt, der Objektcode kann in
  279. mehrere  Blöcke (Objektcodedateien) an verschiedenen Adressen aufgesplittet
  280. werden,  wobei  trotzdem  blockübergreifend  gearbeitet  werden  kann.  Die
  281. einzelnen  Objektcodedateien  müssen  einzeln  zum  C64  übertragen werden.
  282. Jeder  Quelltext  muß mindestens einen ".base"-Pseudo-Opcode enthalten, der
  283. vor der ersten den Objektcode beeinflussenden Anweisung stehen muß.
  284.  
  285. .EQUAL
  286.    Mit dem ".equal"-Pseudo-Opcodes können Labels explizit definiert werden,
  287. das  heißt,  der  dem Label zuzuweisende Wert kann vom Programmierer selbst
  288. angegeben  werden.  Der Labelname muß aber trotzdem als erstes in der Zeile
  289. stehen,  gefolgt  vom  Pseudo-Opcode.   Dessen  Operand schließlich ist der
  290. zuzuweisende  Wert.   Wird  ein  Label in Abhängigkeit eines anderen Labels
  291. definiert,  so  muß  letzteres bereits vorher definiert worden sein, da die
  292. Definition des abhängigen Labels ebenfalls in Pass 1 vorgenommen wird.  Ein
  293. Label  kann  grundsätzlich  nur  einmal  definiert  und nicht mehr geändert
  294. werden  (Ausnahme sind lokale Labels in Makroquelltexten) !  Übrigens:  Die
  295. Zeile    "marke   lda   $2000"   kann   entsprechend   durch   die   beiden
  296. aufeinanderfolgenden  Zeilen  "marke  .equal  *"  und  "lda  $2000" ersetzt
  297. werden.
  298.  
  299. .MACRO - .ENDMACRO
  300.    Die beiden Pseudo-Opcodes ".macro" und ".endmacro" dienen zur Definition
  301. eines  Makros.  Sie umschließen den Makroquelltext.  Nach dem Pseudo-Opcode
  302. ".macro" wird  als erster Parameter der Name des Makros OHNE Anführungszei-
  303. chen angegeben (max. 32 Zeichen).  Als  zweiter Parameter wird optional die
  304. Anzahl  der  Übergabeparameter  hinzugefügt,  welche  Werte  von 1-10 (ein-
  305. schließlich)  annehmen kann. Wird 0 oder gar kein zweiter Parameter angege-
  306. ben, so werden keine Übergabeparameter verwendet. Innerhalb des Makros kann
  307. wie oben beschrieben auf die  Übergabeparameter  zugegriffen  werden.  Alle
  308. innerhalb  des Makroquelltextes definierten Labels gelten als lokale Labels
  309. und   sind   nur   dort   erreichbar.   Anders  als  in  Hochsprachen  sind
  310. Überlappungen von globalen Labels durch lokale Labels gleichen Namens nicht
  311. erlaubt.Innerhalb eines Makroquelltextes darf aus programmtechnischen Grün-
  312. den  weder ein weiteres Makro definiert noch eine Datei per ".include" ein-
  313. gebunden werden, was aber logisch ist, da im ersten Fall Makros bei mehrma-
  314. ligem Aufruf mehrmals definiert werden würden und letzterer Fall nur zu un-
  315. nötig langen  Objektcodedateien beitragen würde. Makroaufrufe können jedoch
  316. sehr wohl  geschachtelt  werden (max. 32 mal), wobei jedoch jedes Makro be-
  317. reits vor seinem Aufruf bekannt sein muß (sowohl in Pass 1 als auch in Pass
  318. 2).
  319.  
  320. .IF - .ELSE - .ENDIF
  321.    Wie  aus  Hochsprachen  bekannt, dienen if-else-endif-Konstruktionen zur
  322. bedingten  Bearbeitung,  in  unserem Fall zur bedingten Assemblierung.  Ist
  323. die  angegebene  Bedingung erfüllt wird der Teil zwischen ".if" und ".else"
  324. assembliert,  der  Teil  nach  ".else"  überlesen.  Ist die Bedingung nicht
  325. erfüllt,  wird  der  Teil zwischen ".if" und ".else" überlesen und zwischen
  326. ".else"  und  ".endif" assembliert.  Der ".else"-Teil kann dabei entfallen,
  327. so  daß  nur  eine  ".if"-".endif"-Konstruktion entsteht, bei der bei nicht
  328. erfüllter  Bedingung  nichts assembliert wird.  ".if"-".else"-".endif"-Kon-
  329. struktionen  können beliebig ineinander oft (max.  65535 mal) verschachtelt
  330. werden
  331.    Die Bedingung selbst wird dem ".if"-Pseudo-Opcode als Operand übergeben.
  332. Dabei wird in zwei Verwendungsweisen unterschieden:
  333.  
  334. - Logische Verknüpfung zweier Operanden
  335. - Prüfung auf Berechenbarkeit eines Operanden
  336.  
  337. In  ersterem  Fall  werden  die Ergebnisse zweier Terme logisch miteinander
  338. verknüpft  und  entsprechend  dem Ergebnis assembliert.  Als erster Operand
  339. des  ".if"-Pseudo-Opcodes  muß  zunächst  der  Vergleichsoperator angegeben
  340. werden,  mit  dem  die  beiden Vergleichsoperanden verknüpft werden sollen.
  341. CrossAss kennt vier Möglichkeiten, wobei KEINE Kombinationen möglich sind:
  342.  
  343. =        prüft auf Gleichheit der beiden Operanden
  344. !        prüft auf Ungleichheit der beiden Operanden
  345. <        prüft, ob erster Operand kleiner als zweiter Operand
  346. >        prüft, ob erster Operand größer als zweiter Operand
  347.  
  348. Als  zweiter  und  dritter  Operand  des  Pseudo-Opcodes  werden  dann  die
  349. Vergleichsoperanden angegeben.  Diese etwas ungewöhnliche Schreibweise soll
  350. an zwei Beispielen verdeutlicht werden:
  351.  
  352. .if =,Label1,Label2        wahr, wenn "Label1" gleich "Label2"
  353. .if <,$c000+23*3,*+10      wahr, wenn $c000+23*3 kleiner 10 +
  354.                            Programmcounter
  355.  
  356. Bei  der  zweiten  Verwendungsmöglichkeit des ".if"-Pseudo-Opcodes wird ge-
  357. prüft, ob ein Term berechnet werden kann, oder ob dabei ein Fehler auftritt
  358. (natürlich  mit  Unterdrückung  einer  Fehlermeldung  die  zum  Abbruch der
  359. Assemblierung  führen  würde).   Dies ist hauptsächlich dann nützlich, wenn
  360. eine  Includedatei  nur  dann  eingebunden werden soll, wenn ein Label, das
  361. diese  Includedatei  kennzeichnet,  noch  nicht  definiert  ist.   Der Sinn
  362. solcher  Maßnahmen  wird  später  noch  ausführlich  erklärt.  Die Zahl der
  363. Vergleichsoperatoren beschränkt sich in diesem Fall auf zwei, nämlich:
  364.  
  365. =        wahr, wenn bei der Berechnung kein Fehler auftritt
  366. !        wahr, wenn bei der Berechnung ein Fehler auftritt
  367.  
  368. Natürlich  kann  es  auch  hier  einen  ".else"-".endif"-Zweig geben.  Auch
  369. hierzu noch zwei Beispiele
  370.  
  371. .if !,Marke                wahr, wenn "Marke" nicht definiert
  372. .if =,1/0                  falsch, da 1/0 nicht berechnet werden kann
  373.  
  374. .INCLUDE
  375.    Der ".include"-Pseudo-Opcode dient vordergründig dazu, eine Datei in den
  376. laufenden  Quelltext ab der Position des Pseudo-Opcodes einzubinden um nach
  377. Beendigung   der   Assemblierung  dieser  Datei  mit  der  Zeile  nach  dem
  378. Pseudo-Opcode   fortzufahren.    Dabei   kann   innerhalb   einer   solchen
  379. Includedatei   eine   weitere  Datei  eingebunden  werden,  da  maximal  32
  380. Verschachtelungen  möglich  sind.   Der Verwendungszweck des Pseudo-Opcodes
  381. liegt  aber  weniger  in  der Auslagerung von Quelltextteilen auf Disk oder
  382. Festplatte  aufgrund  von  Speichermangel, da dieser auf dem Amiga seltener
  383. auftritt  und  außerdem  von  CrossAss  sowieso  nur  immer  die aktuell zu
  384. assemblierende  Zeile im Speicher gehalten wird.  Es ist aber doch wohl so,
  385. daß bestimmte Labels, Makros oder gar Quelltextteile immer wieder verwendet
  386. werden  (Hardwareregister,  Betriebssystemaufrufe  etc.).   Was  liegt also
  387. näher,  als  deren  Definitionen, anstatt sie jedesmal neu an den Quelltext
  388. anzufügen,  einfach  in  eine  Datei auszulagern, die man dann nur noch bei
  389. Bedarf  hinzu  "includen"  muß.   So  kann  man  sich  eigene  Bibliotheken
  390. erstellen,  die  bei Gebrauch immer zur Verfügung stehen.  Später wird noch
  391. einmal  genauer  auf  solche Bibliotheken eingegangen, da mit ihnen äußerst
  392. effizient  gearbeitet  werden  kann,  wenn man sich an einige wenige Regeln
  393. hält.   Außerdem  sind bereits einige vorgefertige Bibliotheken Bestandteil
  394. des  6510-Developers-Packet.  Der ".include"-Pseudo-Opcode erhält daher als
  395. einzigen  Parameter den Dateinamen plus Pfad der einzubindenden Datei. Sol-
  396. lte sich der ".include"-Pseudo-Opcode in  einem  nichtassemblierten Bereich
  397. befinden  ("falscher"   Zweig  einer  ".if"-".else"-".endif"-Konstruktion),
  398. so wird auch nichts eingebunden.
  399.  
  400. .APPEND
  401.    Der   ".append"-Pseudo-Opcode  steht  wegen  der  geringen  Verwendungs-
  402. wahrscheinlichkeit  am  Schluß.   Er  dient  zum  Anhängen  einer  weiteren
  403. Quelltextdatei an das Ende der aktuell bearbeiteten.  Der einzige Fall (den
  404. ich  mir  vorstellen kann),  bei  dem  dies  nötig wird, ist, daß bei einem
  405. Diskettensystem  ein  Quelltext nicht mehr ganz auf Disk Platz findet (also
  406. größer  als  880  KByte  ist!)  und  deshalb  auf  einer  anderen  Disk und
  407. entsprechend  in  einer anderen Datei fortgeführt werden muß.  Im Gegensatz
  408. zu  ".include"  wird  dabei  immer  (auch  wenn ".append" in einem nicht zu
  409. assemblierenden  Bereich  steht)  mit  der  als  Parameter  des  ".append"-
  410. Pseudo-Opcodes angegebenen Datei fortgefahren und nicht mehr zurückgekehrt,
  411. da CrossAss erwartet, daß nach ".append" der alte Quelltext zu Ende ist.
  412.  
  413.    Zum  Schluß  der  Erklärung  des Quelltextaufbaus sollen nun noch einige
  414. Worte zum Thema "Includebibliotheken" fallen.  Bei richtigem Einsatz können
  415. diese  Bibliotheken  zu  einem  mächtigen  Werkzeug  werden,  das  man  als
  416. Programmierer  bald  nicht  mehr missen möchte.  Zunächst sollte jedoch ein
  417. einheitlicher  Aufbau der Includebibliotheken vereinbart werden, sofern man
  418. keine  bösen  Überraschungen  erleben  will.   Außerdem  können, wenn diese
  419. wenigen Regeln eingehalten werden, Includebibliotheken leicht weitergegeben
  420. werden.   Zu  Beginn einer Bibliothek sollte ein Kommentarskopf stehen, der
  421. kurz  den  Inhalt  der Bibliothek umreißt.  Die Bibliothek sollte natürlich
  422. auch  nur das enthalten, was der Kopf (und ihr Dateiname!) verspricht.  Ein
  423. zu Beginn der Bibliothek definiertes Dummy-Label soll als Prüflabel dienen.
  424. Bei  größeren Bibliotheken, die andere Bibliotheken, von denen sie abhängig
  425. sind, einbinden,  kann es leicht geschehen, daß durch Mehrfacheinbindungen,
  426. Labels  oder  Makros  doppelt  zu definieren versucht werden.  Wird vor der
  427. Einbindung  geprüft,  ob  das  der Bibliothek gehörende Dummy-Label bereits
  428. existiert,  so  kann  dies verhindert werden.  Das Label sollte daher einen
  429. markanten, aussagekräftigen Namen besitzen.  Sein Wert ist egal, da nur die
  430. Tatsache  des  "definiert Seins" entscheidet.  Bei Bibliotheken, die Makros
  431. enthalten,  sollte  besonders  gut  kommentiert  werden,  was welches Makro
  432. bewirkt.   Insbesondere  gilt  dies  auch  für  die Übergabeparameter (wenn
  433. vorhanden).
  434.    Vor  einer  Fehlerquelle  soll  jedoch  gewarnt werden:  Das Prinzip des
  435. 2-Pass-Assemblers  verbietet,  daß  eine bedingt eingebundene Datei auch in
  436. Pass  2  eingebunden  und  damit  assembliert wird.  Bei reinen Label- oder
  437. Makrobibliotheken  ist  dies  nicht  weiter  schlimm,  wohl  aber, wenn die
  438. Bibliothek  echten  Quelltext  enthält.   Dieser  wird  bei  Pass 2 einfach
  439. vergessen   !    Quelltext  (direkt  zu  assemblierenden  Quelltext,  nicht
  440. Makroquelltext)  enthaltende Bibliotheken dürfen deshalb NIE bedingt einge-
  441. bunden werden.  Sie sollten von anderen Bibliotheken getrennt (am besten in
  442. verschiedenen Verzeichnissen) aufbewahrt werden.
  443.    Das  6510-Developers-Packet  umfaßt  bereits fünf fertige Includebiblio-
  444. theken:
  445.  
  446. Basic-ROM.inc
  447. Kernel-ROM.inc
  448. SID.inc
  449. CIA.inc
  450. VIC.inc
  451. Basic-Start.inc
  452.  
  453. "Basic-ROM.inc"  und  "Kernel-ROM.inc" enthalten die Einsprungsadressen der
  454. Betriebssystemroutinen  des C64 mit deren Abkürzungen.  VIC.inc und SID.inc
  455. enthalten  die Adressen der Register des VIC bzw.  SID, während CIA.inc nur
  456. die Offsets der CIA-Register und die Basisadressen der beiden CIAs enthält,
  457. welche  entsprechend  addiert werden müssen.  Alle Bibliotheken halten sich
  458. an  die obigen Regeln, die als Prüflabel gedachten Dummies sind die jeweils
  459. als  erstes definierten Labels.  Die Includedatei "Basic-Start.inc" enthält
  460. gegenüber  den anderen Dateien quelltextmodifizierende Anweisungen und darf
  461. deshalb,  wie  oben  erklärt,  NIE  bedingt  eingebunden werden!  Die Datei
  462. bietet komfortable Möglichkeiten, einen Basic-Kopf an ein Assemblerprogramm
  463. zu  binden (so ein Programm kann dann ganz normal mit LOAD "....",8 geladen
  464. und  mit  RUN  gestartet  werden).   Da  die  Includedatei komplizierter zu
  465. handhaben  ist,  befindet  sich  in  ihrem Kommentarskopf eine ausführliche
  466. Verwendungsbeschreibung.   Wie  die Datei gehandhabt wird, kann außerdem am
  467. Beispiel des Source-Codes von "Transfer" ersehen werden.
  468.    Die  Namensendung ".inc" ist bei Includedateien übrigens nicht zwingend.
  469. Wie Dateien heißen, ist CrossAss im allgemeinen egal.  Trotzdem sollte hier
  470. eine    gewisse    Ordnung    eingehalten    werden.    Ein   reibungsloser
  471. Assembliervorgang  wird  Ihnen  dies  lohnen,  wenn solche Regeln allgemein
  472. eingehalten  werden.   Lassen Sie deshalb alle Quelltextdateien auf ".src",
  473. alle  Objektcodedateien  auf  ".obj",  alle  Includedateien  auf ".inc" und
  474. schließlich  alle  Konvertierungsdateien  (wird  später erklärt) auf ".con"
  475. enden und legen Sie sie separat in verschiedene Verzeichnisse.
  476.    Der Amiga bietet die Möglichkeit der Zuweisung logischer Laufwerke.  Das
  477. bedeutet,  daß  einem  bestimmten  Pfad  ein Name zugewiesen wird, über den
  478. dieser  Pfad  dann,  wie  ein  neues  Laufwerk, angesprochen werden.  Unter
  479. Amiga-DOS  übernimmt  dies  der  "Assign"-Befehl.  Gerade diese Möglichkeit
  480. kann bei der Arbeit mit CrossAss vieles erleichtern. Wird auf jedem System,
  481. auf   dem  CrossAss  verwendet  wird,  den  einzelnen  Verzeichnissen,  die
  482. Quelltexte, Objektcodes etc.  enthalten, ein logisches Laufwerk mit jeweils
  483. einheitlichem  Namen  zugewiesen,  so kann jeder Benutzer ohne Probleme auf
  484. diese  Laufwerke  zugreifen  und  wird  immer  im  richtigen  Pfad  landen.
  485. Folgende  logische Laufwerke sollten daher auf jedem System die angegebenen
  486. Pfade repräsentieren:
  487.  
  488. SOURCE:              Pfad des Verzeichnisses, das Quelltexte enthält
  489. OBJECT:              Pfad des Verzeichnisses, in das Objektcodes gelangen
  490. INCLD:               Pfad des Verzeichnisses, in dem sich alle Include-
  491.                      Dateien befinden
  492. CONVERT:             Pfad des Verzeichnisses, in dem sich alle Konver-
  493.                      tierungstabellen befinden
  494.  
  495. Gerade  die Arbeit mit Bibliotheken wird erst hierdurch richtig möglich, da
  496. nun   ganz   global  auf  eine  Bibliothek  mit  "INCLD:Bibliothekname.inc"
  497. zugegriffen  werden  kann,  ohne sich Sorgen zu machen, wo sich die Dateien
  498. eigentlich  tatsächlich  befinden.   Die  für  die  Laufwerke   notwendigen
  499. "assign"-Kommandos  sollten  Sie sich entweder in Ihre User-Startup setzen,
  500. oder in ein IconX-Script, das Sie vor dem Start von CrossAss aufrufen.
  501.  
  502.    Nachdem  nun alles zum Aufbau des Quelltextes gesagt ist, kommen wir zur
  503. Bedienung   des   Programms   selbst.   CrossAss  integriert  sich  in  die
  504. Benutzeroberfläche des Amiga, so daß die Bedienung des Programms für keinen
  505. Amiga-Anwender  zum  Problem  werden  sollte.   Obwohl  CrossAss auch unter
  506. Kickstart  1.3 arbeitet, sollte die Verwendung unter Amiga-OS2.0 vorgezogen
  507. werden, da CrossAss dann den Filerequester der "asl.library" benutzen kann.
  508. CrossAss  besitzt selbst keinen Filerequester.  Unter Kickstart 1.3 erfolgt
  509. die Dateinameneingabe über Tastatur.
  510.    Nach  dem  Start von CrossAss erscheinen zunächst zwei sich überlagernde
  511. Windows,  wobei das obere Window hauptsächlich nur eine Copyright-Erklärung
  512. enthält  und  deshalb durch Klicken seines Close-Gadgets sofort geschlossen
  513. werden kann.
  514.    Das  Copyright-Window  gibt  aber  auch  einige  Informationen  über von
  515. CrossAss belegte Speicherbereiche, auf die jetzt genauer eingegangen werden
  516. soll.   CrossAss belegt für seine Arbeit drei Speicherbereiche, deren Größe
  517. von  Ihnen  bestimmt  werden  kann.   Die Speicherbereiche tragen die Namen
  518. Labeltabelle,   Makrotabelle  und  Makrospeicher.   Die  Labeltabelle  bzw.
  519. Makrotabelle  enthalten,  wie  ihre Namen ja aussagen, alle wichtigen Daten
  520. der  Labels  bzw.  Makros.  Ihre Größe entscheidet darüber, wieviele Labels
  521. bzw.   Makros  überhaupt verwendet werden können.  Der Unterschied zwischen
  522. Makrotabelle  und Makrospeicher ist der, daß in der Makrotabelle alle Daten
  523. über  die  Makros,  im  Makrospeicher  jedoch  die  Makroquelltexte  selbst
  524. gespeichert  werden.   Makrotabelle  und Makrospeicher müssen also immer in
  525. einem  vernünftigen Verhältnis zueinander stehen, denn was nützt eine große
  526. Makrotabelle,  wenn  die Quelltexte der Makros nicht im Makrospeicher Platz
  527. finden?
  528.    Nach  Schließen  des Copyright-Windows wird das gesamte Statuswindow von
  529. CrossAss  sichtbar.  In diesem Fenster werden laufende Ausgaben während der
  530. Assemblierung  gemacht und alle Fehlermeldungen angezeigt.  Hier können Sie
  531. Länge,  Anfangs- und Endadresse des Objektcodes ablesen, die Dateinamen der
  532. aktuellen  Quelltext-  bzw.   Objektcodedateien, die Anzahl der definierten
  533. Labels  und  Makros,  die  aktuell  assemblierte  Zeile im Quelltext (neben
  534. "Zeile:"),  die  Anzahl  der  bisher  insgesamt assemblierten Zeilen (neben
  535. "Zeilen  insg."),  sowie  last  but not least ob ein Fehler aufgetreten ist
  536. bzw.  was CrossAss gerade tut.
  537.    Das  Window besitzt zwei Gadgets, darunter ein Close-Gadget, mit dem das
  538. Programm  beendet  werden  kann.   Das  zweite  Gadget trägt die Aufschrift
  539. "Start"  und  dient  zum  Starten  der  Assemblierung.   Wird  es betätigt,
  540. erscheint  je  nach  Ihrer  Amiga-OS-Version der asl-Filerequester oder ein
  541. Stringgadget  zur  Dateiauswahl.   Wird  der  Auswahlvorgang  durch  das am
  542. jeweiligen  Eingabefenster  befindlichen  Close-Gadget abgebrochen, erfolgt
  543. natürlich  keine  Assemblierung.   Ansonsten ändert sich die Aufschrift des
  544. "Start"-Gadgets  in  "Stop"  und  die  Assemblierung  beginnt.  Während der
  545. Assemblierung  wird  zyklisch  der Fensterinhalt des Statuswindow erneuert,
  546. laut  (änderbarer)  Voreinstellung  nach  jeweils 100 assemblierten Zeilen.
  547. Wird die Assemblierung nicht durch das "Stop"-Gadget abgebrochen, endet sie
  548. entweder, wenn CrossAss einen Fehler entdeckt oder das Ende des Quelltextes
  549. erreicht und die Assemblierung somit erfolgreich war.
  550.    Während der Assemblierung kann die Anzeige "Quelldatei" in "akt.  Makro"
  551. wechseln, nämlich dann, wenn CrossAss einen Makroquelltext assembliert.  Da
  552. CrossAss  sich  nicht  die  Datei  und Position des Makroquelltextes merkt,
  553. sondern  diesen im Makrospeicher hält, erfolgt die Anzeige auf diese Weise.
  554. Die  Anzeige  "Zeile"  beginnt  dabei  bei  0,  so daß bei einem Fehler die
  555. angegebene Zeile, die fehlerhafte Zeile im Makroquelltext darstellt.
  556.    CrossAss  besitzt eine eigene Menüleiste mit einer ganzen Reihe weiterer
  557. Funktionen, die nun im einzelnen erklärt werden sollen.
  558.  
  559. Menü "Datei", Menüpunkt "Übertragen"
  560.    Wird  der  Menüpunkt  aufgerufen,  erscheint  wieder  der der OS-Version
  561. entsprechende Filerequester zur Auswahl einer Objektcodedatei.  Wurde zuvor
  562. bereits  assembliert,  erscheint  der   Namen  der  zuletzt erzeugten Datei
  563. automatisch,  so  daß,  wenn  kein  anderer  gewählt  werden  soll,  direkt
  564. fortgefahren werden kann.  Nach der Auswahl beginnt die Übertragung.  Amiga
  565. und  C64  müssen  dabei  mit  dem Parallelkabel verbunden sein und eine der
  566. beiden   Empfangsprogramme   auf   dem  C64  gestartet  worden  sein.   Die
  567. Übertragung  läßt sich nicht abbrechen, da die Kontrolle während der ganzen
  568. Übertragung   an  das  Amiga-Betriebssystem  übergeben  wird.   Sollte  die
  569. Verbindung  nicht  stimmen,  hängt  der  Computer  und  gibt  CrossAss  die
  570. Kontrolle  nicht  mehr  zurück.   Prüfen Sie deshalb vorher die Verbindung.
  571. Trotzdem:  Verbinden Sie die Computer NIEMALS in eingeschaltetem Zustand!!
  572.  
  573. Menü "Datei", Menüpunkt "Information"
  574.    Sollten  Sie  einmal  das  starke Bedürfnis haben, den Namen des Authors
  575. oder  die  Copyrightmeldung  zu  lesen,  dann  sollten Sie diesen Menüpunkt
  576. aufrufen.   Es  erscheint  das  Copyright-Window,  wie  nach  dem Start von
  577. CrossAss.
  578.  
  579. Menü "Datei", Menüpunkt "Ende"
  580.    Dieser Menüpunkt beendet CrossAss.
  581.  
  582. Menü "Tabellen", Menüpunkt "Labels"
  583.    Über  das  "Tabellen"-Menü  macht  CrossAss  dem Benutzer seine internen
  584. Tabellen  zugänglich.   Über  den "Labels"-Menüpunkt, kann CrossAss' Label-
  585. tabelle  sichtbar  gemacht  werden.   Sie  erscheint (wie alle Tabellen des
  586. "Tabellen"-Menüs")  in  einem  eigenen  Window.  Die Labels werden in einem
  587. Kasten  dargestellt, der max.  15 Einträge enthalten kann.  Durch Betätigen
  588. der  Pfeilgadgets  oder  durch Benutzen des Rollbalkens kann der Inhalt des
  589. Kastens  gerollt  werden.   Die  Labels  erscheinen  mit  ihren  Werten  in
  590. dezimaler  und  hexadezimaler  Form,  wie  im  Tabellenkopf über dem Kasten
  591. angegeben.   Durch  das  Close-Gadget  kann das Tabellen-Window geschlossen
  592. werden.   Sollten  bei der Anzeige plötzlich mehrere Labels gleichen Namens
  593. mit  verschiedenen  Werten  angezeigt werden, so handelt es sich hierbei um
  594. lokale Labels, die in Makros definiert wurden.
  595.  
  596. Menü "Tabellen", Menüpunkt "Makros"
  597.    Entsprechend  dem  "Labels"-Menüpunkt  erscheint  hier  der  Inhalt  der
  598. Makrotabelle.   Die  Makros  werden  mit  Namen, Länge im Makrospeicher und
  599. ihrer Übergabeparameteranzahl angegeben.
  600.  
  601. Menü "Tabellen", Menüpunkt "Blöcke"
  602.    Die  Möglichkeit des Objektcodesplittings durch CrossAss in verschiedene
  603. Objektcodedateien  bietet  zahlreiche Vorteile.  Allerdings wird im Status-
  604. window nur der aktuelle Objektcodedateinamen angezeigt.  Über den Menüpunkt
  605. "Blöcke"  können  alle  Objektcodedateinamen  inkl.  Start-, Endadresse und
  606. Länge  sichtbar  gemacht  werden.   Allerdings  merkt  sich CrossAss nur 32
  607. Objektcodedateinamen, was wohl völlig ausreicht.  Der ".base"-Pseudo-Opcode
  608. kann aber dennoch mehr als 32 mal im Quelltext verwendet werden.
  609.  
  610. Menü "Tabellen", Menüpunkt "Mnemonics"
  611.    Für  seine internen Arbeiten benötigt CrossAss eine Tabelle, die zusätz-
  612. lich  zu  den  Namen  der  einzelnen Mnemonics auch ihre Adressierungsarten
  613. angibt.   Über  den  "Mnemonics"-Menüpunkt  wird  dem  Programmierer  diese
  614. Tabelle,  sozusagen  als besonderer Service, zugänglich gemacht.  Besonders
  615. bei  sehr  optimierter  Programmierung,  kann  man leicht in die Versuchung
  616. geraten,  z.B.  ein ASL-Mnemonic mit Zeropage-Y-indizierter Adressierung zu
  617. verwenden,  weil  dies  eben  so gut passen würde, obwohl es der 6510 nicht
  618. ermöglicht.   Die Tabellenkopf enthält Abkürzungen für die einzelnen Adres-
  619. sierungsarten.   Je  nachdem,  ob ein Mnemonic eine Adressierungsart kennt,
  620. steht in dieser Spalte ein Stern ("*").  Die einzelnen Abkürzungen sind:
  621.  
  622.   IM :  immediate
  623.   AB :  absolut
  624.   AX :  absolut x-indiziert
  625.   AY :  absolut y-indiziert
  626.   ZP :  Zeropage
  627.   ZX :  Zeropage x-indiziert
  628.   ZY :  Zeropage y-indiziert
  629.   ID :  indiziert indirekt
  630.   DI :  indirekt indiziert
  631.   RE :  relativ
  632.   IN :  indirekt (nur JMP-Mnemonic)
  633.   AI :  Akkumulator/implement (wird vom Assembler nicht unterschieden)
  634.  
  635. Menü "Einstellungen", Menüpunkt "Ändern"
  636.    Das  "Einstellungen"-Menü  enthält  alle Funktionen, die mit der Vorein-
  637. stellungsdatei  "s:CA.prefs" zu tun haben.  Diese Datei wird beim Start von
  638. CrossAss  geladen  und enthält alle vom Benutzer gewünschten Eingaben.  Ist
  639. diese  Datei  noch  nicht  vorhanden,  wie z.B.  beim allerersten Start von
  640. CrossAss, so wird sie, mit den Grundeinstellungen gefüllt, erzeugt.
  641.    Nach Aufruf des Menüpunkts "Ändern" erscheint das Einstellungswindow von
  642. CrossAss mit insgesamt vier String- und zwei Boolean-Gadgets, mit denen die
  643. Einstellungen  manipuliert werden können.  Eines der beiden Boolean-Gadgets
  644. trägt die Aufschrift "OK".  Bei Betätigung schließt das Einstellungsfenster
  645. und  die  neuen  Einstellungen  werden  aktiv.   Wird das Fenster durch das
  646. ebenfalls   vorhandene   Close-Gadget  geschlossen,  werden  die  aktuellen
  647. Veränderungen  vergessen und die vor Aufruf des "Ändern"-Menüpunkts aktiven
  648. Einstellungen zurückgeholt.
  649.    Die  ersten  drei String-Gadgets dienen zur Größenbestimmung von Label-,
  650. Makrotabelle  und Makrospeicher.  Für die Größe der Label- und Makrotabelle
  651. muß  die  Anzahl  der  Labels  bzw.   Makros  angegeben  werden, die in die
  652. Tabellen  passen  sollen.   Rechts  daneben  wird  dann  angezeigt, wieviel
  653. Speicher  in  Byte  diese  Anzahl  benötigt.   Erscheint  als Anzeige 0, so
  654. übersteigt  die  Größe  der  Tabelle  den  freien  Speicher.  Die Größe des
  655. Makrospeichers  muß direkt in Bytes angegeben.  Wie bereits erwähnt, sollte
  656. man  ein  vernünftiges  Verhältnis  zwischen Makrospeicher und Makrotabelle
  657. einhalten,  so  daß  der  Quelltext  der  in der Makrotabelle speicherbaren
  658. Makros  auch  wirklich  im  Makrospeicher Platz findet.  Tatsächlich belegt
  659. werden  die drei von CrossAss benötigten Speicherbereiche übrigens erst bei
  660. Beginn der Assemblierung.
  661.    Das vierte String-Gadget mit der Überschrift "Refresh-Rate" gibt an, wie
  662. oft  CrossAss  während  der  laufenden Assemblierung den Inhalt des Status-
  663. windows  erneuern  soll.   Nach  dem eingetragenen Wert von Zeilen wird der
  664. Windowtext  "refreshed".  Sehr kleine Werte ermöglichen ein gutes Verfolgen
  665. des  Assembliervorganges,  bremsen  diesen  jedoch  stark ab, während große
  666. Werte Zeit sparen helfen.
  667.    Das  zweite Boolean-Gadget trägt die Aufschrift "Sort".  Es bestimmt, ob
  668. die  Labels  nach  Beenden  oder  Abbruch  der  Assemblierung  alphabetisch
  669. sortiert  werden  sollen.   Das Gadget ist ein Toggle-Gadget und kann somit
  670. als Schalter benutzt werden, um die Sortierung an- oder auszuschalten.  Als
  671. Sortieralgorithmus wird "Straight Insertion" benutzt (nicht der schnellste,
  672. aber  doch  mehr als doppelt so schnell wie Bubble-Sort).  Durch Abschalten
  673. der  Sortierung  kann  bei  langen  Labeltabellen Zeit gespart werden.  Die
  674. Labels werden dann in der Reihenfolge der Definition angezeigt.
  675.  
  676. Menü "Einstellungen", Menüpunkt "Speichern"
  677.    Erweisen  sich  modifizierte  Einstellungen als besonders gut, so können
  678. Sie  sie  mit  dem  Menüpunkt  "Speichern" zusammen mit einer evtl.  vorher
  679. geladenen  Konvertierungstabelle  (siehe  unten)  in die Datei "s:CA.prefs"
  680. speichern.  Die Einstellungen inkl.  Konvertierungstabelle stehen dann nach
  681. jedem Start von CrossAss sofort zur Verfügung.
  682.  
  683. Menü "Einstellungen", Menüpunkt "Laden"
  684.    Erweisen  sich  modifizierte  Einstellungen  hingegen  als  unbrauchbar,
  685. nachdem  Sie  bereits das Einstellungswindow verlassen haben, so können Sie
  686. mit  dem  Menüpunkt  "Laden" die zuletzt gespeicherten Einstellungen wieder
  687. laden.  Testen Sie deshalb Ihre Einstellungen, bevor Sie sie speichern.
  688.  
  689. Menü "Einstellungen", Menüpunkt "KonvertTab laden"
  690.    Mehrmals  wurde  bereits  von  der Konvertierungstabelle gesprochen, die
  691. CrossAss  benutzt,  um  Texte  und  Zeichen,  bevor  sie  in  den Quelltext
  692. eingefügt werden, anzupassen.  Dies ist notwendig, da der Amiga und der C64
  693. verschiedene  ASCII-Tabellen  verwenden, begründet durch ihre verschiedenen
  694. Zeichensätze.  Die Konvertierungstabelle kann beliebig geändert werden.  Da
  695. sie  jedoch  256 Einträge besitzt, die man dem Benutzer wohl nicht zutrauen
  696. kann,  jedes mal eintippen zu müssen, wurde die Möglichkeit geschaffen, die
  697. Konvertierungsdatei  mit  einer  Beschreibungsdatei  zu  beschreiben.  Eine
  698. solche  Beschreibungsdatei  wird mit Ihrem Texteditor erstellt.  Jede Zeile
  699. enthält  dann  zunächst  einen  Amiga-ASCII-Code  und  durch mindestens ein
  700. Leerzeichen  getrennt  den  entsprechenden  C64-Code.   Zum  Erstellen  der
  701. eigentlichen  Konvertierungstabelle  benutzt CrossAss ein Verfahren, das am
  702. besten   am  einem  Beispiel  verdeutlicht  werden  kann.   Angenommen  die
  703. Beschreibungsdatei sieht wie folgt aus:
  704.  
  705. 0 10
  706. 2 40
  707. 5 0
  708.  
  709. CrossAss  liest  zunächst die erste Zeile und nummeriert ab dem angegebenen
  710. Amiga-Code die Konvertierungstabelle beginnend mit dem C64-Code fortlaufend
  711. durch.  Diese würde nach der ersten Zeile wie folgt aussehen:
  712.  
  713. Amiga-Code     C64-Code
  714.    0              10
  715.    1              11
  716.    2              12
  717.    3              13
  718.    4              14
  719.    5              15
  720.    6              16
  721.    7              17
  722.          usw.
  723.  
  724. Danach  wird  die  zweite  Zeile interpretiert und wieder ab dem Amiga-Code
  725. durchnummeriert:
  726.  
  727. Amiga-Code     C64-Code
  728.    0              10
  729.    1              11       (bis hier zugewiesen durch Zeile 1)
  730.    2              40       (ab hier zugewiesen durch Zeile 2)
  731.    3              41
  732.    4              42
  733.    5              43
  734.    6              44
  735.    7              45
  736.          usw.
  737.  
  738. Mit der dritten Zeile wird genauso verfahren:
  739.  
  740. Amiga-Code     C64-Code
  741.    0              10 
  742.    1              11       (bis hier zugewiesen durch Zeile 1)
  743.    2              40
  744.    3              41
  745.    4              42       (bis hier zugewiesen durch Zeile 2)
  746.    5               0       (ab hier zugewiesen durch Zeile 3)
  747.    6               1
  748.    7               2
  749.  
  750. Mit  diesem  Verfahren  kann  auf  einfache  Weise mit wenigen Angaben eine
  751. Konvertierungstabelle erstellt werden.  Die Amiga-Codes müssen jedoch immer
  752. klein  beginnen  und  dann  ansteigen,  da  sonst vorhergehende Zuweisungen
  753. wieder  ganz  überschrieben  werden.   Die  Zahlen  können in allen Zahlen-
  754. systemen  (8 Bit) angegeben werden, allerdings nicht als Terme.  Die Angabe
  755. direkt   als   Zeichen  scheidet  aus,  da  diese  durch  eine  noch  nicht
  756. vollständige  Konvertierungstabelle (eben die gerade im Aufbau befindliche)
  757. konvertiert  würden,  was  falsche  Werte  ergäbe.   Konvertierungstabellen
  758. dürfen und sollten auch Kommentare enthalten.  Eine Kommentarszeile muß mit
  759. einem  Semikolon (";") in der ersten (1.) Spalte beginnen.  Auch Leerzeilen
  760. benötigen ein Semikolen!
  761.    Das  6510-Developers-Packet enthält bereits zwei Konvertierungstabellen,
  762. die  wie  vereinbart immer über das logische Laufwerk "CONVERT:" erreichbar
  763. sein  sollten.   "C64.con"  wandelt  Amiga-ASCII-Codes  in C64-ASCII-Codes,
  764. während "SCode.con" in C64-Bildschirm-Codes wandelt.
  765.    Nach  Aufruf  des  Menüpunktes  erscheint  der  dem  verwendeten OS ent-
  766. sprechende   Filerequester  zur  Auswahl  der  Beschreibungsdatei.   Danach
  767. startet  die Generierung der Tabelle.  Kann CrossAss die Beschreibungsdatei
  768. nicht richtig interpretieren, erscheint eine Fehlermeldung.
  769.  
  770. Menü "Drucken", Menüpunkt "Quelldatei"
  771.    Das letzte der vier Pull-Down-Menüs von CrossAss enthält Funktionen, die
  772. zum  Ausdruck  von  Quelltext, Label-, Makro- und Blocktabelle dienen.  Der
  773. Ausdruck  erfolgt dabei im Normalfall nicht direkt auf den Drucker, sondern
  774. in  eine  Textdatei.  Dies ist logisch, da ja das Parallelkabel vom C64 zum
  775. Amiga   den   Parallelport   belegt,   an  dem  normalerweise  ein  Drucker
  776. angeschlossen  ist.   Sollte  dies  nicht  der  Fall  sein (oder sollte Ihr
  777. Drucker   am   seriellen  Port  angeschlossen  sein),  kann  im  jeweiligen
  778. Filerequester natürlich auch "prt:" als Dateinamen eingegeben werden.  Wird
  779. bei den Druckfunktionen eine bereits vorhandene Datei ausgewählt, so werden
  780. die  auszudruckenden  Daten  an diese angehängt.  Die entstandene Textdatei
  781. kann mit einem Texteditor bearbeitet werden.
  782.    Der  Menüpunkt "Quelldatei" dient zum Online-Drucken des Quelltextes mit
  783. den  erzeugten Opcodes während der Assemblierung.  Dies ist nur so möglich,
  784. da  CrossAss ja jeweils nur die aktuell assemblierte Zeile im Speicher hält
  785. und  sich  den  Quelltext nicht merkt.  Nach Aufruf des Menüpunktes und der
  786. Dateinameneingabe erscheint deshalb nur die Meldung, daß der Quelltextdruck
  787. nun eingeschaltet ist.  Der Druck erfolgt dann bei jedem Assembliervorgang,
  788. solange bis die Funktion durch nochmaliges Auswählen des Menüpunktes wieder
  789. abgeschaltet wird.  Bei Makrodefinitionen wird nur deren Kopf- und Fußzeile
  790. ausgedruckt.   Der  Quelltext mit angepassten Opcodes wird bei jedem Aufruf
  791. des Makros ausgedruckt.
  792.  
  793. Menü "Drucken", Menüpunkt "Labels"
  794.    Der  Menüpunkt  "Labels"  dient  zum  Drucken  der  Labeltabelle in eine
  795. Textdatei.    Da  die  Labeltabelle  erst  nach  vollendeter  Assemblierung
  796. fertiggestellt ist, kann sie erst nach deren Beendigung gedruckt werden.
  797.  
  798. Menü "Drucken", Menüpunkt "Makros"
  799.    Die Funktionsweise des "Makros"-Menüpunktes entspricht der des "Labels"-
  800. Menüpunktes, mit dem Unterschied, daß die Makrotabelle gedruckt wird.
  801.  
  802. Menü "Drucken", Menüpunkt "Blöcke"
  803.    Die  letzte  der  Druckfunktionen druckt schließlich die vom Objektcode-
  804. splitting  per ".base" und dem gleichnamigen Menüpunkt des "Tabellen"-Menüs
  805. bekannte  Blocktabelle  aus.  Die Bedienung ist dieselbe wie bei den obigen
  806. Menüpunkten "Makros" bzw.  "Labels".
  807.  
  808.    Nachdem  alle  Funktionen  von  CrossAss hinreichend ausführlich erklärt
  809. worden sind, dürfte einer reibungslosen Arbeit nichts mehr entgegen stehen.
  810. Im  Anschluß  sollten noch einige Hinweise zu den beiden Empfangsprogrammen
  811. für den C64 gemacht werden.
  812.    Die  erste  Empfangsroutine  "Transfer" dient zum direkten Speichern der
  813. übertragenen Daten auf Diskette.  Sie eignet sich deshalb besonders gut für
  814. große  Programmprojekte  (für  die das 6510-Developers-Packet ja geschaffen
  815. wurde).  Nach dem Start des Programmes mit
  816.  
  817. LOAD "TRANSFER",8
  818.  
  819. und  <RUN>  erscheint  eine  kleine  Titelmeldung und eine Aufforderung zur
  820. Eingabe des Dateinamens unter dem die Daten gespeichert werden sollen.  Ist
  821. eine  Datei  mit  diesem  Namen  bereits vorhanden wird sie zuvor (und ohne
  822. Warnung !) per SCRATCH-Befehl gelöscht, bevor die Daten gespeichert werden.
  823. Transfer  startet  dann  die  Übertragungsroutine.   Daß  Transfer von Disk
  824. geladen  werden muß, sollte auch bei Floppies ohne Speeder nicht stören, da
  825. Transfer  nur  2  Blöcke  auf  Disk  belegt.   Obwohl  bei  der  parallelen
  826. Übertragung  jeweils  8  Bit übertragen werden erscheint diese bei Transfer
  827. relativ  langsam.   Das  liegt  jedoch  nicht  an  der Übertragungsroutine,
  828. sondern  an  den  langsamen  Diskettenroutinen des C64-Betriebssystem.  Ein
  829. Floppyspeeder  schafft  hier  Abhilfe.   Die  Übertragung braucht nicht auf
  830. beiden  Rechnern  gleichzeitig  gestartet  zu  werden  (was auch nur schwer
  831. möglich wäre); die Rechner warten selbstständig aufeinander.
  832.    Die  zweite  Empfangsroutine  "TransRAM" überträgt die empfangenen Daten
  833. nur  ins  RAM  des  C64.  Sie eignet sich zum schnellen Austesten kleinerer
  834. Routinen.  Eine Dateinameneingabe ist überflüssig.  Die Routine wird mit
  835.  
  836. LOAD "TRANSRAM",8,1
  837.  
  838. geladen.   SYS  53048 startet die Empfangsroutine, die das obere Ende des 4
  839. KByte-Bereich  ab  49152  belegt.   TransRAM  meldet "waiting for data" und
  840. sobald  die  ersten Daten vom Amiga ankommen "receiving from xxxxx".  xxxxx
  841. ist  dabei die von CrossAss mit übertragene Startadresse .  Die Übertragung
  842. geht  dabei  durch  Fehlen der Diskettenzugriffe wesentlich schneller.  Ist
  843. die  Übertragung  beendet,  erscheint zusätzlich die Endadresse.  Tritt ein
  844. Fehler  auf, meldet TransRAM "failed".  Für solch einen Fehler kann es zwei
  845. Gründe geben:
  846.    1. Die Startadresse wurde unvollständig übertragen (die Übertragung
  847.       brach also folglich bereits nach einem Byte ab)
  848.    2. Das Highbyte der Adresse, an die die Daten übertragen werden sollen,
  849.       überstieg den Wert 255 (Speicherende).
  850. Beide  Empfangsroutinen  sind  übrigens  bereits  mit  CrossAss entwickelte
  851. Programme,  die mit einer alten, großteils in Basic geschriebenen Empfangs-
  852. routine   übertragen   wurden.    Die   Sourcecodes   "Transfer.src"   bzw.
  853. "TransRAM.src"  können  wie  vereinbart  über das logische Laufwerk SOURCE:
  854. erreicht werden.
  855.  
  856.    Zum  Schluß  noch zur Abrundung der Anleitung noch einige Tips, die sich
  857. als hilfreich erwiesen haben:
  858.    Die   Pseudo-Opcode-Konstruktion   ".if"-".else"-".endif"  erlaubt,  wie
  859. bereits  gesagt  keine  Kombination  von  Vergleichsoperatoren.  Die beiden
  860. häufig  benötigten  Vergleichsoperatoren  größer/gleich  ">="  und kleiner/
  861. gleich  "<="  lassen sich jedoch einfach erzeugen, indem der Block zwischen
  862. ".if" und ".else" leer gelassen wird.  Beispiele:
  863.  
  864. .if <,lab,10         ;"Gegenteil" von >=
  865. .else
  866.    lda  $2000        ;nur wenn dieses NICHT erfüllt ist,
  867. .endif               ;wird assembliert.
  868.  
  869. bzw.
  870.  
  871. .if >,lab,10
  872. .else
  873.    lda  $2000
  874. .endif
  875.  
  876.    Die Adressierungsart der Zeile
  877.      jmp (2312+43)-(3+2)
  878. würden  Sie sicherlich richtig mit "JMP-absolut" beantworten, auch wenn der
  879. Term  der  Adresse  geklammert  ist.  CrossAss ist da anderer Meinung.  Die
  880. Routinen    zur   Identifizierung   der   Adressierungsart   beachten   aus
  881. Geschwindigkeitsgründen  nur  die äußersten Klammern und erkennen diese als
  882. Kennzeichen  der  Adressierungsart  "JMP-indirekt".  Da diese Klammern dann
  883. zusätzlich  noch  entfernt  werden,  gerät  alles durcheinander.  Um diesem
  884. Fehler zu entgehen, gibt es drei Möglichkeiten:
  885.  
  886. 1. Sie vermeiden grundsätzlich Klammern am Anfang und Ende eines
  887.    JMP-Operanden, so daß CrossAss garnicht auf die Idee kommt, eine
  888.    indirekte Adressierung zu interpretieren.
  889. 2. Sie fügen am Anfang oder am Ende eine Dummy-Rechenoperation hinzu,
  890.    die nur dazu dient, die Verwechslung auszuschließen:
  891.    JMP 0+(2312+43)-(3+2)
  892.    JMP (2312+43)-(3+2)*1
  893. 3. Sie verwenden anstatt der runden Klammern eckige Klammern, die nicht an
  894.    Adressierungsmerkmal verwendet werden dürfen. Eine Zeile
  895.    JMP [2312+43]-[3+2]
  896.    wird demnach korrekt assembliert.
  897.  
  898. Ähnliche  Probleme  gibt  es bei der indizierten Adressierung.  Hier können
  899. verschiedene   Fehler   auftreten,  wie  z.B.   das  CrossAss  meldet,  das
  900. "fehlerhafte"  Mnemonic  kenne keine indiziert indirekte Adressierung.  Die
  901. obigen  Tricks  helfen  aber  immer.   Sollte  obige Anweisung wirklich ein
  902. indirektes  JMP-Mnemonic sein, so müssen übrigens nochmals Klammern gesetzt
  903. werden, damit die Termberechnung nach entferntem Adressierungsmerkmal nicht
  904. durcheinander gerät:
  905.     JMP ((2312+42)-(3+2))
  906.    Fehler,  die scheinbar in Makroquelltexten auftreten, müssen nicht immer
  907. am  Makroquelltext  liegen.   Oftmals  ist  ein  falscher Übergabeparameter
  908. schuld.  Übergabeparameter können intensive Auswirkungen haben, sie bestim-
  909. men  teilweise  sogar die Adressierungsart von Mnemonics.  Als Beispiel sei
  910. die  einfache  Zeile  "lda  ?0,y" dienen.  Wird ein 8-Bit-Übergabeparameter
  911. übergeben,   bricht   der   Assembler   ab,   da   das  LDA-Mnemonic  keine
  912. Zeropage-y-indizierte Adressierung kennt.  Abhilfe:  "lda !?0,y".
  913.    Mit dem 6510-Developers-Packet Programme für andere Rechner mit dem 6510
  914. zu entwickeln dürfte keine große Schwierigkeit sein.  Besonders einfach ist
  915. dies  natürlich  für den großen Bruder des C64, den C128 zu realisieren, da
  916. dieser  ja  über  den  C64-Modus  verfügt.   Programme  für  ihn werden mit
  917. CrossAss  assembliert, im C64-Modus übertragen und auf Disk gespeichert und
  918. im  128-Modus  dann  geladen  und  gestartet.   Für  andere  Rechner (Atari
  919. 800XL/130XE,  Apple  II,  alte  CBM-Rechner  etc.) müsste sowohl eine Hard-
  920. waregrundlage (Übertragungskabel) als auch eine Empfangsroutine geschrieben
  921. werden,  um  mit dem 6510-Developers-Packet arbeiten zu können.  Vielleicht
  922. findet auch hier jemand Möglichkeiten.
  923.  
  924.    Zum Schluß bleibt mir nur noch zu hoffen, daß das 6510-Developers-Packet
  925. für  viele  Programmierer  ein  nützliches  Werkzeug  wird, das ihre Arbeit
  926. erleichtert.
  927.  
  928.  
  929.  
  930. Einige Begriffserläuterungen:
  931.  
  932. ASSEMBLIERUNG / ASSEMBLER:
  933.    Genaueres unter -> Quelltext.
  934.  
  935. LABEL (= Symbol):
  936.    Alphanumerische Zeichenkette, die im -> Quelltext einen ihr zugewiesenen
  937. Wert  vertritt.   Der  Labelname muß mit einem Buchstaben beginnen und darf
  938. bis zu 32 Zeichen lang sein, wobei dann auch Ziffern und das Zeichen "_" im
  939. Namen  enthalten  sein dürfen.  Die Wertzuweisung erfolgt entweder explizit
  940. per  ->  Pseudo-Opcode  ".equal"  oder  durch  Angabe  am Zeilenanfang.  In
  941. letzterem  Fall  wird  dem  Label der aktuelle Wert des -> Programmcounters
  942. zugewiesen.  Die Groß- und Kleinschreibung wird bei Labels beachtet, so daß
  943. sowohl ein Label "Marke" als auch ein Label "marke" oder "MARKE" existieren
  944. kann, die alle unterschiedliche Werte repräsentieren.
  945.  
  946. MAKRO:
  947.    Alphanumerische  Zeichenkette,  die  im Quelltext einen ihm zugewiesenen
  948. Makroquelltext  vertritt.   Das  Makro wird mit den Pseudo-Opcodes ".macro"
  949. und  ".endmacro"  definiert.  Zur Namensgebung gelten dieselben Regeln  wie
  950. bei  Labeldefinitionen. Das Makro kann je nach  Definition  bis zu 10 Über-
  951. gabeparameter  erhalten,  die  nur  innerhalb  des Makroquelltextes bekannt
  952. sind.  Innerhalb eines Makros definierte -> Labels gelten als lokale Labels
  953. und sind nur innerhalb des Makroquelltextes bekannt.
  954.  
  955. MNEMONIC:
  956.    Mnemonic  ist die Bezeichnung für alle standarisierten Befehlskürzel zur
  957. Vertretung von Maschinensprachbefehlen (-> Opcodes).  Da die Programmierung
  958. rein  durch  Zahlen  oder gar Bitfolgen wohl alles andere als einfach wäre,
  959. bekommen  die  einzelnen  Befehle Namen, eben die Mnemonics.  CrossAss hält
  960. sich  genau  an  den  Standard des 6510, der von anderen Assemblern bekannt
  961. ist.   Jedes  Mnemonic  ist  genau drei Zeichen lang.  Mnemonics sind nicht
  962. "case  sensitiv";  es ist also egal, ob Mnemonics groß, klein oder gemischt
  963. geschrieben werden.
  964.  
  965. OBJEKTCODE (= Objektprogramm):
  966.    Die  entgültige  Bitfolge (oder besser Bytefolge), die das tatsächliche,
  967. vom  Prozessor  verständliche  Programm  darstellt.   Um  diese erzeugen zu
  968. können benötigt man eben den Assembler.
  969.  
  970. OPCODE (= Operationscode):
  971.    Ein  Mikroprozessor  wie  der  6510  des  C64  versteht  eigentlich  nur
  972. Bitfolgen.    Acht  solcher  Bits  zusammen  kennzeichnen  einen  bestimmte
  973. Funktion  des  Prozessors, die dieser ausführt, wenn er bei der Abarbeitung
  974. auf  diese  Bitfolge  stößt.   Ein  Opcode ist also nichts anderes als eine
  975. 8-Bit-Zahl, die einen solchen Befehl darstellt.
  976.  
  977. PSEUDO-OPCODE (= Pseudoinstruktion, Direktive):
  978.    Pseudo-Opcodes sind Anweisungen, die im Gegensatz zu -> Mnemonics den ->
  979. Assembler  selbst  etwas  tun lassen und damit die -> Assemblierung an sich
  980. beeinflussen.   Die  Aufgaben  der  einzelnen Pseudo-Opcodes variieren sehr
  981. stark und sind deshalb in der Anleitung einzeln beschrieben.
  982.  
  983. QUELLTEXT (= Quellcode, Quellprogramm, Sourcecode):
  984.    Ein  6510-Assembler-Programm  als  ASCII-Textdatei.   Um dieses Programm
  985. ausführen  zu  können,  muß  es erst in die für den Prozessor verständliche
  986. Bitfolge  (->  Opcodes)  umgewandelt  werden.   Diesen  Vorgang  nennt  man
  987. "Assemblierung",   das   Programm,  das   diese  Arbeit  erledigt  ist  der
  988. "Assembler".
  989.